package com.magina.calendario;

import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;

import java.util.HashMap;

public class CategoriaProvider extends ContentProvider
{
    SQLiteDatabase db;

	// Authority do nosso provider, a ser usado nas Uris.
	public static final String AUTHORITY = "com.magina.calendario.CategoriaProvider";
	
	// Nome do arquivo que ira conter o banco de dados.
	private static  final String DATABASE_NAME = "dbmag000.db";

    // Versao do banco de dados.
    // Este valor e importante pois e usado em futuros updates do DB.
    private static final int DATABASE_VERSION;
	
	// Nome da tabela que ira conter as anotacaes.
	private static final  String CATEGORIA_TABLE = "categoria";

	// 'Id' da Uri referente as notas do usuario.
	private  static final int CATEGORIA = 3;


    // Uri matcher - usado para extrair informacoes das Uris
    private static final UriMatcher mMatcher;

    private static HashMap<String, String> mProjection;

    static {
        mProjection = new HashMap<String, String>();
        mProjection.put(Categoria.NOTE_ID, Categoria.NOTE_ID);
        mProjection.put(Categoria.TEXT, Categoria.TEXT);
        DATABASE_VERSION = 1;
    }
    
    static {
    	mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		mMatcher.addURI(AUTHORITY, CATEGORIA_TABLE, CATEGORIA);
    }
    
    
	/////////////////////////////////////////////////////////////////
	//           Metodos overrided de ContentProvider              //
	/////////////////////////////////////////////////////////////////
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
         int count;
        switch (mMatcher.match(uri)) {
        	case CATEGORIA:
                count = db.delete(CATEGORIA_TABLE, selection, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("URI desconhecida " + uri);
        }
	 
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
	}

	@Override
	public String getType(Uri uri) {
	        switch (mMatcher.match(uri)) {
	            case CATEGORIA:
	                return Categoria.CONTENT_TYPE;
	            default:
	                throw new IllegalArgumentException("URI desconhecida " + uri);
	        }
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
        switch (mMatcher.match(uri)) {
	    	case CATEGORIA:
		        long rowId = db.insert(CATEGORIA_TABLE, Categoria.TEXT, values);
		        if (rowId > 0) {
		            Uri noteUri = ContentUris.withAppendedId(Categoria.CONTENT_URI, rowId);
		            getContext().getContentResolver().notifyChange(noteUri, null);
		            return noteUri;
		        }
	        default:
	            throw new IllegalArgumentException("URI desconhecida " + uri);
        }
	}

	@Override
	public boolean onCreate() {
        DBHelper mHelper = new DBHelper(getContext());
        db = mHelper.getWritableDatabase();
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
			// Aqui usaremos o SQLiteQueryBuilder para construir
			// a query que sera feito ao DB, retornando um cursor
			// que enviaremos e aplicacao.
	        SQLiteQueryBuilder builder = new  SQLiteQueryBuilder();
	        Cursor cursor;
	        switch (mMatcher.match(uri)) {
	            case CATEGORIA:
	            	// O Builer recebera dois parametros: a tabela
	            	// onde sera feita a busca, e uma projection -
	            	// que nada mais e que uma HashMap com os campos
	            	// que queremos recuperar do banco de dados.
	                builder.setTables(CATEGORIA_TABLE);
	                builder.setProjectionMap(mProjection);
	                break;
	 
	            default:
	                throw new IllegalArgumentException("URI desconhecida " + uri);
	        }
	        cursor = builder.query(db, projection, selection,selectionArgs, null, null, sortOrder);

	        cursor.setNotificationUri(getContext().getContentResolver(), uri);

	        return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
	        int count;
	        switch (mMatcher.match(uri)) {
	            case CATEGORIA:
	                count = db.update(CATEGORIA_TABLE, values, selection, selectionArgs);
	                break;	 
	            default:
	                throw new IllegalArgumentException("URI desconhecida " + uri);
	        }
	 
	        getContext().getContentResolver().notifyChange(uri, null);
	        return count;
	}
	
	/////////////////////////////////////////////////////////////////
	//                Inner Classes utilitarias                    //
	/////////////////////////////////////////////////////////////////
    public static final class Categoria implements  BaseColumns {
        public static final Uri CONTENT_URI = Uri.parse("content://"
	                + CategoriaProvider.AUTHORITY + "/categoria");
	 
        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.magina.categoria";
	 
        public static final String NOTE_ID = "_id";
        public static final String TEXT = "Nom_Categoria";
    }
    
    private static class DBHelper extends SQLiteOpenHelper {
	 
        DBHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
	 
        /* O metodo onCreate e chamado quando o provider e executado pela
         * primeira vez, e usado para criar as tabelas no database
         */
        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL("CREATE TABLE " + CATEGORIA_TABLE + " (" +
            		Categoria.NOTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            		Categoria.TEXT + " TEXT" + ");");
        }
	        
        /* O metodo onUpdate e invocado quando a versao do banco de dados
         * muda. Assim, e usado para fazer adequacoes para a aplicacao
         * funcionar corretamente.
         */	 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            db.execSQL("DROP TABLE " + CATEGORIA_TABLE + ";");
            this.onCreate(db);
        }
   }
}
